home *** CD-ROM | disk | FTP | other *** search
- {$X+,V-,B-}
- program S_PEP;
-
- { Testprogram for the nwPEP unit / NwTP 0.6 API. (c) 1993,1995, R.Spronk }
-
- uses crt,nwMisc,nwIPX,nwPEP; { Listener/ Slave }
-
- { Listen for incoming packet.. sent acknowledgement of receipt }
-
- { Note that the acknowledgement is done automatically by the receiving ESR }
-
- CONST IOSocket=$5678;
-
- Var ListenECB :Tecb;
- ListenPepHdr :TpepHeader;
-
- SendECB :Tecb;
- SendPepHdr :TpepHeader;
-
- socket :word;
- buf :array[1..546] of byte;
- t :byte;
- ReceivedBufLen:word;
- PacketReceived:boolean;
-
- NewStack:array[1..1024] of word; { !! used by ESR }
- StackBottom:word; { !! used by ESR }
-
-
-
- {$F+}
- Procedure ListenAndAckHandler(Var p:TPecb);
- begin
- If (ListenECB.CompletionCode<>0)
- or (ListenPepHdr.IPXhdr.packetType<>PEP_PACKET_TYPE)
- or (ListenPepHdr.clienttype<>$EA)
- then IPXlistenForPacket(ListenECB)
- else begin
- PacketReceived:=true;
- ListenPepHdr.IPXhdr.source.socket:=swap(ListenPepHdr.IPXhdr.source.socket);
- { socket is hi-lo in IPX/PEPHeaders. SetupSendECB expects lo-hi }
- PEPsetupSendECB(NIL,IOsocket,ListenPepHdr.IPXhdr.source,@buf,0,
- SendPepHdr,SendECB);
- SendPepHdr.TransactionId:=ListenPepHdr.TransactionId;
- SendPepHdr.clientType:=$EA;
- IPXsendPacket(SendECB);
- end;
- end;
- {$F-}
-
- {$F+}
- Procedure ListenAndAckESR; assembler;
- asm { ES:SI are the only valid registers when entering this procedure ! }
- mov dx, seg stackbottom
- mov ds, dx
-
- mov dx,ss { setup of a new local stack }
- mov bx,sp { ss:sp copied to dx:bx}
- mov ax,ds
- mov ss,ax
- mov sp,offset stackbottom
- push dx { push old ss:sp on new stack }
- push bx
-
- push es { push es:si on stack as local vars }
- push si
- mov di,sp
-
- push ss { push address of local ptr on stack }
- push di
- CALL ListenAndAckHandler
-
- add sp,4 { skip stack ptr-copy }
- pop bx { restore ss:sp from new stack }
- pop dx
- mov sp,bx
- mov ss,dx
- end;
- {$F-}
-
-
- Var dest:TinternetworkAddress;
- ticks,ticks2:word;
-
- begin
- IF NOT IpxInitialize
- then begin
- writeln('Ipx needs to be installed.');
- halt(1);
- end;
- socket:=IOSocket;
- IF NOT IPXopenSocket(Socket,SHORT_LIVED_SOCKET)
- then begin
- writeln('IPXopenSocket returned error# ',nwIPX.result);
- halt(1);
- end;
-
- { listen for incoming pep-packet }
-
- PacketReceived:=False;
- { Empty receive buffer (ListenECB.fragment[2].address^) }
- FillChar(buf,546,#0);
-
- { Setup ECB and IPX header }
- PEPSetupListenECB(Addr(ListenAndAckESR),IOsocket,@buf,546,
- ListenPepHdr,ListenECB);
-
- IPXListenForPacket(ListenECB);
- writeln('Listening for incoming packet.');
-
- IPXGetIntervalMarker(ticks);
- REPEAT
- IPXrelinquishControl;
- IPXGetIntervalMarker(ticks2)
- UNTIL PacketReceived or ((ticks2-ticks)>(30*18));
-
- { do something with received buffer }
- IF PacketReceived
- then writeln('Packet received and acknowledged.')
- else writeln('Timeout: no packet received in 30 seconds.');
-
- IF NOT IPXcloseSocket(IOsocket)
- then writeln('IPXcloseSocket returned error# ',nwIPX.result);
-
- end.
-